From 27ed9fb11d0597dc489d1af4ccb834b4371db440 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?utf8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Thu, 26 Jan 2017 17:44:01 +0000 Subject: [PATCH] GDK W32: Different maximized window position for non-CSD windows It seems that WM interprets the same MINMAXINFO contents differently depending on which styles the window has. Play along. https://bugzilla.gnome.org/show_bug.cgi?id=765161 --- gdk/win32/gdkevents-win32.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index 614fa689d6..1cba4c4fd9 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -2242,8 +2242,25 @@ _gdk_win32_window_fill_min_max_info (GdkWindow *window, * window will actually end up. * "0" here is the top-left corner of the primary monitor. */ - mmi->ptMaxPosition.x = 0 + (nearest_info.rcWork.left - nearest_info.rcMonitor.left); - mmi->ptMaxPosition.y = 0 + (nearest_info.rcWork.top - nearest_info.rcMonitor.top); + /* An investigation into bug 765161 turned up a weird Windows WM behaviour + * where it would interpret "0:0" as "top-left of the workea" (accounting for a taskbar + * possibly being along the left/top edge of the screen) when window has styles + * (i.e. not CSD), and interpret the same "0:0" as "top-left of the screen" (not + * accounting for a taskbar) when window has no styles (i.e. a CSD window). + * This doesn't seem to be documented anywhere. + * The following code uses a simple CSD/non-CSD test, but it could be that + * this behaviour hinges on just one particular window style. + * Finding exactly which style that could be is not very useful for GTK, however. + */ + mmi->ptMaxPosition.x = 0; + mmi->ptMaxPosition.y = 0; + + if (_gdk_win32_window_lacks_wm_decorations (window)) + { + mmi->ptMaxPosition.x += (nearest_info.rcWork.left - nearest_info.rcMonitor.left); + mmi->ptMaxPosition.y += (nearest_info.rcWork.top - nearest_info.rcMonitor.top); + } + mmi->ptMaxSize.x = nearest_info.rcWork.right - nearest_info.rcWork.left; mmi->ptMaxSize.y = nearest_info.rcWork.bottom - nearest_info.rcWork.top; } -- 2.30.2